package com.imooc.reflect;

public class ClassDemo1 {
    public static void main(String[] args) {
        Foo foo1 = new Foo();
        //Foo这个类也是一个实例对象，Class类的实例对象如何表示呢？它就不能new出来了。但有三种表示方法
        //任何一个类都是Class的实例对象，这个实例对象有三种表示方式：
        //第一种：实际在告诉我们，任何一个类都有一个隐含的静态成员变量class
        Class c1 = Foo.class;

        //第二种：已知该类的对象，通过getClass方法
        Class c2 = foo1.getClass();

        //官网说：c1, c2表示了Foo类的类类型（class type）万事万物皆对象，类也是对象，是Class类的实例对象，这个对象我们称为该类的类类型
        //不管c1 or c2，都代表了Foo类的类类型。一个类只可能是Class类的一个实例对象
        System.out.println(c1==c2);

        //第三种表达方式：
        Class c3 = null;
        try {
            c3 = Class.forName("com.imooc.reflect.Foo");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(c2 == c3);

        // 我们完全可以通过类的类类型创建该类的对象实例----> 通过c1orc2orc3创建Foo的实例
        try {
            Foo foo = (Foo)c1.newInstance(); // 这句话能执行的前提是必须要有无参数的构造方法。
            foo.print();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

    }
}

class Foo{
    void print(){
        System.out.println("foo");
    }
}
